package com.example.java_chatroom.api;

import com.example.java_chatroom.component.CommonSession;
import com.example.java_chatroom.model.MessageSession;
import com.example.java_chatroom.model.User;
import com.example.java_chatroom.model.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户相关的api
 */
@Slf4j
@RestController
public class UserAPI {

    /**
     * user表的mapper
     */
    @Resource
    UserMapper userMapper;

    /**
     * session公共服务类
     */
    @Resource
    private CommonSession commonSession;

    /**
     * 登录接口
     * @param username      用户名
     * @param password      密码
     * @param req           HttpServletRequest
     * @return      返回一个user对象
     */
    @PostMapping("/login")
    @ResponseBody
    public Object login(String username, String password, HttpServletRequest req) {
        // 1. 先去数据库中查查, 看 username 能否找到对应的 user 对象
        //    如果能找到则看一下密码是否匹配
        User user = userMapper.selectByName(username);
        if (user == null || !user.getPassword().equals(password)) {
            // 这俩条件具备一个, 就是登录失败!! 同时返回一个空的对象即可.
            log.info("登录失败! 用户名或者密码错误!，{}", user);
            // 返回一个空的user对象
            return new User();
        }

        // 2. 如果都匹配, 登录成功! 创建会话!!
        // 这里是登录，所以session有不存在的情况，参数为true的意思就是不存在session就会创建一个
        HttpSession session = req.getSession(true);
        // 将user对象放到session里面
        session.setAttribute("user", user);
        // 在返回之前, 把 password 给干掉. 避免返回不必要的信息.
        user.setPassword("");
        // 返回查询出来的user对象
        return user;
    }

    /**
     * 用户注册接口
     * @param username      用户名
     * @param password      密码
     * @return  返回注册之后的信息，如果是注册成功，返回注册成功的用户id以及用户姓名，如果注册失败，返回一个空的对象
     */
    @PostMapping("/register")
    @ResponseBody
    public Object register(String username, String password) {
        // 构建一个user对象，需要写进数据库
        User user = new User();
        try {
            // 设置用户名
            user.setUsername(username);
            // 设置密码
            user.setPassword(password);
            // 写入数据库
            userMapper.insert(user);
            log.info("用户[{}]注册成功。", username);
            // 将密码设置为空，因为前端不需要接收后端返回的密码
            user.setPassword("");
        } catch (DuplicateKeyException e) {
            // 如果 insert 方法抛出上述异常, 说明名字重复了. 注册失败.
            log.info("注册失败! username = {}", username);
        }
        // 返回user对象
        return user;
    }

    /**
     * 获取当前登录用户信息
     * @param req       HttpServletRequest
     * @return      返回相应的用户信息
     */
    @GetMapping("/userInfo")
    @ResponseBody
    public Object getUserInfo(HttpServletRequest req) {
        // 1. 先从请求中获取到会话
        User user = commonSession.getUserBySession(req, "getUserInfo");
        // 如果user为null，则直接返回
        if (null == user) {
            return new User();
        }
        // 在返回之前, 把 password 给干掉. 避免返回不必要的信息.
        user.setPassword("");
        // 返回user
        return user;
    }
}

